﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HWR_Ants.Classes;
using System.IO;

namespace HWR_Ants.Forms
{
    public partial class fAusgabe : Form
    {
        private UpdateEventArgs results = null;

        public fAusgabe()
        {
            InitializeComponent();
            this.Text = "Ergebnis";
            setAusgabeAnzahlAmeisen(100);  //testzahlen
            setAnzahlIterationen(30);
            setAnzahlStädteAusgabe(17);
            setBenötigteZeitAusgabe(new TimeSpan());
            setbesteRoute("165");
            setDurchschnittsRouteAusgabe("134");
        }

        public fAusgabe(UpdateEventArgs e)
        {
            InitializeComponent();
            this.Text = "Ergebnis";
            setAnzahlIterationen(e.CurrentIteration);
            setAnzahlStädteAusgabe(e.BestTour.ToArray().Length);
            setAusgabeAnzahlAmeisen(Tools.Tools.ActiveCurrentOptions.AntsCounter);
            setBenötigteZeitAusgabe(e.TimeUsed);
            City[] cities = e.BestTour.ToArray();
            string concatedString = String.Empty;

            foreach (City c in cities)
                concatedString += c.Name + "; ";
            
            // setbesteRoute(concatedString);
            setbesteRoute(e.DS_Global.ToString());
            setDurchschnittsRouteAusgabe(e.CurrentBestValue.ToString());
            this.results = e;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        public void setAusgabeAnzahlAmeisen(int ameisen){
            l_AnzahlderAmeisen.Text = ameisen.ToString();
        }
        public void setAnzahlStädteAusgabe(int städte)
        {
            l_AnzahlderStädteAusgabe.Text = städte.ToString();
        }
        public void setDurchschnittsRouteAusgabe(string droute)
        {
            l_durchschnittsRouteAusgabe.Text = droute;
        }
        public void setbesteRoute(string broute)
        {
            l_längebestRouteAusgabe.Text = broute;
        }
        public void setAnzahlIterationen(int iterationen)
        {
            l_AnzahlIterationenAusgabe.Text = iterationen.ToString();
        }
        public void setBenötigteZeitAusgabe(TimeSpan zeit)
        {
            DateTime dt = new DateTime(zeit.Ticks);
            string time = dt.ToString("HH:mm:ss"); 
            l_benötigteZeitAusgabe.Text = time;
        }
        public string getAnzahlStädteAusgabe()
        {
           string städte = l_AnzahlderStädteAusgabe.Text;         
           return städte;
        }
        public string getDurchschnittsRouteAusgabe()
        {
            string droute = l_durchschnittsRouteAusgabe.Text;
            return droute;
        }
        public string getbesteRoute()
        {
            string broute = l_längebestRouteAusgabe.Text;
            return broute;
        }
        public string getAnzahlIterationen()
        {
            string iterationen = l_AnzahlIterationenAusgabe.Text;
            return iterationen;
        }
        public string getBenötigteZeitAusgabe()
        {   
            string zeit = l_benötigteZeitAusgabe.Text;
            return zeit;
        }

        private void bt_SaveResults_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.InitialDirectory = Directory.GetCurrentDirectory();
            sfd.Filter = "ResultatTextDateien|*.txt|Alle Dateien|*.*";
            sfd.FileName = results.Filename;
            sfd.DefaultExt = ".txt";
            if (DialogResult.OK ==  sfd.ShowDialog())
            {
                fileSave(sfd.FileName);
            }
        }

        private void fileSave(string p)
        {
            List<String> storeStringList = new List<string>();
            IEnumerable<City> cityList = results.BestTour;
            Options o = Tools.Tools.getCurrentStoredOptions();

            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add("Results");
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add(createStringWithPadding(20, "Filename") + results.Filename + ".tsp");
            storeStringList.Add(createStringWithPadding(20, "Number of Citys") + (cityList.Count()).ToString());
            storeStringList.Add(createStringWithPadding(20, "Best Tour Value") + results.CurrentBestValue.ToString());
            storeStringList.Add(createStringWithPadding(20, "Durchschnitt Global") + results.DS_Global.ToString());
            storeStringList.Add(createStringWithPadding(20, "Time Used") + new DateTime(results.TimeUsed.Ticks).ToString("HH:mm:ss.fffffff") );
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add(String.Empty);
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add(createStringWithPadding(20, "Options"));
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add(createStringWithPadding(20, "Ants") + o.AntsCounter);
            storeStringList.Add(createStringWithPadding(20, "Stopcriteria") + o.Stopp);
            switch (o.Stopp)
            {
                case "Iteration":
                    storeStringList.Add(createStringWithPadding(20, "Iterations") + o.IterationCounter);
                    break;
                case "Schwellenwert":
                    storeStringList.Add(createStringWithPadding(20, "Schwellenwert") + o.Schwellenwert);
                    break;
                case "Lösung":
                    storeStringList.Add(createStringWithPadding(20, "Iterations") + o.IterationCounter);
                    storeStringList.Add(createStringWithPadding(20, "Schwellenwert") + o.Schwellenwert);
                    break;
            }
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add(createStringWithPadding(20, "Parameter"));
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add("     " + createStringWithPadding(15, "Alpha") + o.Parameter.Alpha);
            storeStringList.Add("     " + createStringWithPadding(15, "Beta") + o.Parameter.Beta);
            storeStringList.Add("     " + createStringWithPadding(15, "Rho") + o.Parameter.Rho);
            storeStringList.Add("     " + createStringWithPadding(15, "Tau0") + o.Parameter.Tau);
            storeStringList.Add("     " + createStringWithPadding(15, "Q") + o.Parameter.Q);
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add(String.Empty);
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add("Citylist with Coordinates");
            storeStringList.Add(Tools.Tools.fillString(70, "="));

            int counter = 1;
            foreach (City c in cityList)
            {
                storeStringList.Add(getCityString(c, counter));
                counter++;
            }
            foreach (City c in cityList)
            {
                storeStringList.Add(getCityString(c, counter));
                break;
            }
            storeStringList.Add(Tools.Tools.fillString(70, "="));
            storeStringList.Add("EOF");
            File.WriteAllLines(p, storeStringList.ToArray());
        } 

        private string getCityString(City c, int counter)
        {
            string temp = counter.ToString();
            temp = temp.PadLeft(4);
            string concatedString = temp + ": ";
            temp = Convert.ToInt32(c.Name).ToString().PadLeft(4);
            concatedString += temp + ", Coords: X - ";
            temp = c.Coord.X.ToString().PadLeft(4);
            concatedString += temp + ", Y - ";
            temp = c.Coord.Y.ToString().PadLeft(4);
            concatedString += temp;
            return concatedString;
        }

        private string createStringWithPadding(int length, string s)
        {
            return createStringWithPadding(length,s,": ");
        }

        private string createStringWithPadding(int length, string s, string extension)
        {
            return s.PadRight(length) + extension;
        }
    }
}
